use std::ffi::{CString, CStr};
use std::ptr;
use std::fs;
use std::path::{Path, PathBuf};
use rand::seq::SliceRandom;
use rand::distributions::Alphanumeric;
use rand::{thread_rng, Rng};

// 注意：在Cargo.toml中添加 rand = "0.8" 以使用最新版本的 rand crate

// 定义一个函数，接收 *mut c_char 类型参数，返回 Option<*mut c_char>
#[no_mangle]
pub extern "C" fn SelectRandomFile(folder: *mut std::os::raw::c_char) -> *mut std::os::raw::c_char {
    // 将输入的 C 字符串转换为 Rust 字符串
    let folder_path = unsafe {
        if folder.is_null() {
            return ptr::null_mut();
        }
        CStr::from_ptr(folder)
            .to_string_lossy()
            .into_owned()
    };

    // 使用 Path 类型来处理路径
    let path = Path::new(&folder_path);

    // 获取目录下的文件列表
    let files: Vec<_> = match fs::read_dir(path) {
        Ok(entries) => entries
            .filter_map(|entry| entry.ok())
            .map(|entry| entry.path())
            .collect(),
        Err(_) => return ptr::null_mut(),
    };

    // 从文件列表中随机选择一个文件
    let random_file = files.choose(&mut rand::thread_rng());
    if random_file == None{
        return ptr::null_mut();
    }
    let file=random_file;
    // 将选中的文件路径转换为 C 字符串
    let file_path_str = file.expect("REASON").to_string_lossy();
    let file_path_cstring = CString::new(file_path_str.as_bytes());
    match file_path_cstring  {
        Err(..)=> return ptr::null_mut(),
        Ok(..)=> return file_path_cstring.expect("REASON").into_raw(),
    }
}
#[no_mangle]
pub extern "C" fn rand_str(folder: *mut std::os::raw::c_char) -> *mut std::os::raw::c_char {
    if folder.is_null() {
        return ptr::null_mut();
    }
    // 将输入的 C 字符串转换为 Rust 字符串
    let folder_path = unsafe {
        CStr::from_ptr(folder)
            .to_string_lossy()
            .into_owned()
    };

    // 使用 Path 类型来处理路径
    let folder_path = Path::new(&folder_path);

    // 生成唯一的文件名
    let unique_filename = loop {
        let random_suffix: String = thread_rng()
            .sample_iter(&Alphanumeric)
            .take(8)
            .map(char::from)
            .collect();
        let filename = format!("unique_file_{}", random_suffix);

        let filepath = folder_path.join(&filename);

        // 检查文件是否存在，如果不存在则退出循环
        if !filepath.exists() {
            break filepath;
        }
    };

    // 将选中的文件路径转换为 C 字符串
    let unique_filename_str = unique_filename.to_string_lossy();
    let unique_filename_cstring = CString::new(unique_filename_str.as_bytes()).expect("REASON");
    let result = unique_filename_cstring.into_raw();
    return result;
}